iT邦幫忙

2024 iThome 鐵人賽

DAY 27
1
Python

時空序列分析-關鍵籌碼分析系列 第 27

番外篇1 - 用 python 程式撰寫一般交易回測-Moving Average Strategy(1/2)

  • 分享至 

  • xImage
  •  

針對昨天文章 subaru219 的留言,
因為網站的規則,我現階段沒辦法留言和回覆,因此在這裡回覆您!
https://ithelp.ithome.com.tw/upload/images/20240826/20168322ywoiP0BsLf.png

謝謝您提出的想法! 在更早之前我也有想過這個問題,

其實這個題目一開始的目標是為了找出有隱藏關聯的券商分點

(感覺這方法很有趣,但不一定會真的有效)

隔日沖我覺得比較像是意外事件
面對意外事件,單純用模型來分析可能需要更多的資料,
也可能不需要用到 convLSTM ,單純用 LSTM 訓練籌碼資料就可以學習到隔日沖的規則。
如果要實際進行股票買賣的話,我覺得搭配個人的交易策略來應對會更加合適

另外,針對建議"透過買賣超張數去預測隔日的股價",
一開始我腦袋浮現的想法,是用"股價資料預測股價"、"籌碼資料預測籌碼",
不過這個建議很有道理,這樣才能建立起籌碼跟股價之間的關聯性。
如果要修正的話,
我可能要思考一下如何安排資料的形狀和欄位,模型也可能更換成其他。
例如將地理特徵和籌碼特徵放在一起,再進行資料轉置。



既然說到了策略,銜接一下 DAY10這篇,

我們已經可以透過向證交所的網站發送請求爬取股價,也可以繪製K線圖,

當然,接下來也能針對線圖加上自己理想中的交易策略!

這邊用python寫策略有一種原生的感覺,也比起用一般的網站平台提供的策略回測工具還要辛苦,
不過會有一種特別的成就感,而且有一種可以隨身攜帶的感覺(就存在自己的電腦或雲端空間)。


這邊撰寫策略是延續 DAY10-繪製K線圖 繼續寫下去,
裡面的程式碼和變數一樣,就不貼過來這邊,會影響文章的整潔度。

用python撰寫策略進行回測,需要一些基本的步驟,

像是交易策略->策略發動的訊號->進行回測->計算績效,最後再看要不要視覺化。

這邊使用 移動平均線交叉策略 (Moving Average Crossover Strategy)

交易策略和訊號的規劃:

  • (1) 用兩條移動平均線(短期和長期)進行交叉的策略。
  • (2) 當 短MA>長MA 時,產生買入訊號(這邊短期平均線簡稱為短MA,長期平均線為長MA)。
  • (3) 當 短MA<長MA 時,產生賣出訊號。
  • (4) 用交易訊號來模擬買賣,也要計算每天的持倉狀態和資金變化。
  • (5) 計算策略的總收益、年化報酬率、最大回撤之類的指標。
# 這個函式用來計算移動平均線 (data 可以放股票收盤價,window 控制均線計算的時間區間要多長)
def moving_average(data, window):
    return data.rolling(window=window).mean()
# 用短期移動平均和長期移動平均來產生雙均線策略的交易訊號
def generate_signals(data, short_window, long_window):
    signals = pd.DataFrame(index=data.index)
    signals['price'] = data['Close'] #用每天的收盤價
    signals['short_mavg'] = moving_average(data['Close'], short_window) #短期移動平均線
    signals['long_mavg'] = moving_average(data['Close'], long_window) #長期移動平均線
    
    signals['signal'] = 0.0 #把交易訊號初始化
    # 1-> 買進, 0-> 持有、賣出
    signals['signal'][short_window:] = np.where(signals['short_mavg'][short_window:] > signals['long_mavg'][short_window:], 1.0, 0.0)
    # 訊號的狀態,+1 表示新的買入訊號,-1 表示新的賣出訊號
    signals['positions'] = signals['signal'].diff()
    return signals

看一下寫好的訊號長什麼樣子

# 這邊短MA設為40天,MA40;長MA設為100天,MA100
signals = generate_signals(all_data, short_window=40, long_window=100)
signals

KeyError: 'Close'
---> signals = generate_signals(all_data, short_window=40, long_window=100)

找不到 close 收盤價! 難道是欄位名稱不對嗎@@
但是上面的程式都正常執行,暫時抓不出bug在哪,可能要把data都印出來看一下。

今天都在跑研究的東西,太晚寫文章了,
明天還要上課,早上就盡速把這個錯誤排除掉,
不好意思,謝謝大家耐心地等待。


寫了這個既可以用來延續這系列的文章,
剛好自己的研究也會用到回測,一舉兩得(?

每日記錄:
加權指數收在 22185點,下跌55.12點,
交易量一直在縮,今天連三千億都不到了,有很多人都收手在觀望的樣子。
然後外資又繼續加空期貨單。


上一篇
時空序列分析-關鍵籌碼分析的結論心得與未來方向
下一篇
番外篇1 - 用 python 程式撰寫一般交易回測-Moving Average Strategy(2/2) 策略優化與視覺化
系列文
時空序列分析-關鍵籌碼分析31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言